package test.singleton;

/**
 * 可以通过静态内部类的方式实现线程安全的懒汉式单例模式。
 * 这种方式利用了 JVM 类加载机制保证线程安全，且实现延迟加载。
 * <p>
 * 实现原理：
 * <p>
 * 延迟加载：当外部类被加载时，内部类不会被立即初始化，只有在调用 getInstance() 方法时才会加载内部类
 * 线程安全：JVM 在类加载时会自动加锁（ClassLoader 的 loadClass 方法），保证静态成员的初始化线程安全
 * 高效性：不需要使用 synchronized 关键字，性能更好
 * 优势：
 * <p>
 * 比双重检查锁更简洁
 * 天然防止反射攻击（通过构造方法检查）
 * 支持序列化安全（通过 readResolve 方法）
 * 完全懒加载且线程安全
 * 注意事项：
 * <p>
 * 如果使用反射攻击，需要在构造方法中添加防御代码
 * 需要处理反序列化问题（实现 readResolve 方法）
 * 在 Java 5 之前的内存模型下可能需要添加 volatile 关键字，但在现代 Java 版本中不需要
 */
public class Singleton {
    // 1. 私有构造方法
    private Singleton() {
        // 防止通过反射创建实例
        if (SingletonHolder.instance != null)
            throw new RuntimeException("单例模式禁止反射创建");
    }

    // 2. 静态内部类
    private static class SingletonHolder {
        // JVM 保证类加载时的线程安全
        private static final Singleton instance = new Singleton();
    }

    // 3. 全局访问点
    public static Singleton getInstance() {
        return SingletonHolder.instance;
    }

    // 防止反序列化破坏单例
    private Object readResolve() {
        return SingletonHolder.instance;
    }
}
